package main

import "fmt"

// 定义一个结构体
type Person2 struct {
	name, city string
	age        int
	school     struct {
		name, city string
		age        int
	}
}

func NewPerson2(name, city string, age int) *Person2 {
	return &Person2{
		name: name,
		city: city,
		age:  age,
	}
}

// 定义方法，结构体的方法 p 是接收者，指针类型接收者可以达到修改接收者值的目的
// 要想修改接收者的属性，只能使用指针接收者
//
func (p *Person2) DoDream() {
	p.age = 10000
	//fmt.Printf("DoDream 的 p 的内存地址：%p\n", p)
}


//方法和接收者
func main() {
	p1 := NewPerson2("name","city",22)
	fmt.Printf("main 函数 的 p1 的内存地址：%p\n", p1)

	p1.DoDream()
	fmt.Print(p1.age)
}

// 什么时候要用指针类型
// 1. 需要修改接收者的值
// 2. 接收者是拷贝代价比较大的对象
// 3， 保证一致性，如果有某个方法使用了指针接收者，那么其他方法也要使用指针接收者

// 只有我定义的类型才能添加方法

// 通过类型别名给 内置类型添加方法
type MyInt int

func (m *MyInt) Calc(){
	fmt.Print("hello world")
}